/* 博弈论
    SG函数
    sg(x)表示x下一步不能到达的最小状态，即0-(x-1)的状态都是可以到达的
    mex 函数：mex(S)=min{x},(x∉S,x∈N) (不属于集合S的最小自然数)
    SG 函数：SG(x)=mex{SG(y1),SG(y2),…,SG(yk)},( yi 为 x 的后继状态(1⩽i⩽k))
    n 个有向图，起点分别为 s1,s2,…sn，则SG(s1)⨁SG(s2)⨁…⨁SG(sn)=0 时先手必败，否则必胜

    证明:
        while(a1^a2^...^an) { //只取一次使得异或结果为0
            int x = a1^a2^...^an;
            设x的最高位的"1"是第k位
            一定存在ai的第k位是1，且ai^x < ai
            则将当前所有第k位是"1"的ai异或x
            一定可以使所有ai异或结果为0
        }
        则如果异或结果初始不为0，可以经过处理变为0
        所以异或结果=0先手必败，否则先手必胜(下一次给对手的结果为异或结果为0)

* 本题:
    a=每堆石子只有一个的堆的数量 (堆的石子数量!=1)b=剩余堆数+剩余石子总数-1
    * 简单情况:a=0 -> 所有堆的石子个数>1
            先手必胜<->b是奇数
            奇数一定存在一个偶数后继
            偶数所有后继必然是奇数
            结论1:
                1.如果堆数 >1，可以合并其中两堆石子，这样b就会变成偶数
                2.如果堆数=1，就可以拿掉1个石子，这样b也会变成偶数
            结论2:
                1.合并其中的两堆石子：显然，b会变成奇数
                2.取了一个石子：
                    (1)取得石子个数 >2：石子个数 − 1，b会变成奇数
                    (2)取得石子个数 =2：石子个数变成了1(继续分情况讨论)：
                        1)只有一堆：b是奇数，对手必胜
                        2)多于一堆：b是奇数，对手就可以把剩下的一个石子放到其他的堆里面去，后手同样必胜
            
            
    * 转移方程 f(a, b) ->
            1.从A中某堆取走石子 f(a-1, b)
            2.从B中某堆取走石子 f(a, b-1)
            3.合并两个B中的堆 f(a, b-1)
            4.合并两个A中的堆，f(a-2, b+3) (如果b原本不为空，则b+3，否则b+3-1)       
            5.合并A中和B中的一个堆 f(a-1, b+1)

           
*/
#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

const int N = 55, M = 50010;
int f[N][M];

int dp(int a, int b)
{
    int &v = f[a][b];
    if(v != -1) return v;
    if(!a) return v = b%2; 
    if(b == 1) return dp(a+1, 0);

    //枚举v能去的每一个下一步
    if(a && !dp(a-1, b)) return v = 1;
    if(b && !dp(a, b-1)) return v = 1;
    if(a >= 2 && !dp(a-2, b + (b?3:2))) return v = 1;
    if(a && b && !dp(a-1, b+1)) return v = 1;
    return v = 0;
}

signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
    #else
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #endif

    memset(f, -1, sizeof f);

    int T; cin >> T;
    while(T--) {
        int n; cin >> n;
        int a = 0, b = 0;
        for(int i = 0; i < n; i++)
        {
            int x; cin >> x;
            if(x == 1) a++;
            else b += b ? x+1 : x;
        }

        if(dp(a, b)) puts("YES");
        else puts("NO");
    }
    return 0;
}